package com.qf.test;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;


public class ShiroDemo {

    public static void main(String[] args) {

        //1. 获取SecurityManager核心对象
        DefaultSecurityManager securityManager = new DefaultSecurityManager();

        //2. 获取配置文件中的权限数据, 用户数据, 角色数据
        IniRealm iniRealm = new IniRealm("classpath:shiro.ini");

        //3. 将用户, 角色, 权限数据放入SecurityManager核心对象中.
        securityManager.setRealm(iniRealm);

        //4. 设置SecurityManagerUtils核心对象工具类
        SecurityUtils.setSecurityManager(securityManager);

        //5. 得到Subject当前登录用户对象
        Subject subject = SecurityUtils.getSubject();

        //6. 登录, 封装AuthenticationToken对象, 模拟用户在页面输入的用户名密码
        AuthenticationToken token = new UsernamePasswordToken("zhangsan", "123456");

        //7. 调用login登录方法, 让shiro框架核心SecurityManager对象去验证用户输入的用户名密码和
        //配置文件或者数据库中记录的用户名, 密码是否一致. 进行权限校验
        try {

            subject.login(token);
            System.out.println("========用户登录成功!========");

            //8. 如果用户名, 密码不对, 抛出对应的异常
        } catch (UnknownAccountException e) {
            System.out.println("=======用户名不对=======");
        }catch (IncorrectCredentialsException e) {
            System.out.println("========密码不对===============");
        } catch (AuthenticationException e) {
            System.out.println("=======其他未知异常======");
        }

        //9. 如果用户名密码正确, 获取, 用户, 角色, 权限等框架中能够获取到的用户信息打印, 登录成功
        System.out.println("==================登陆后判断用户角色===============================================");
        System.out.println("======判断用户是否为管理员角色=======" + subject.hasRole("admin"));
        System.out.println("======判断用户是否为开发者角色=======" + subject.hasRole("developer"));
        System.out.println("======判断用户是否为xxx角色==========" + subject.hasRole("xxx"));

        System.out.println("==================登陆后判断用户权限=====父模块:子模块:操作==========================================");
        System.out.println("======判断当前用户是否有用户添加权限操作======" + subject.isPermitted("sys:user:add"));
        System.out.println("======判断当前用户是否有用户删除权限操作======" + subject.isPermitted("sys:user:del"));
        System.out.println("======判断当前用户是否有菜单添加权限操作======" + subject.isPermitted("sys:menu:add"));
        System.out.println("======判断当前用户是否有菜单删除权限操作======" + subject.isPermitted("sys:menu:del"));
    }
}